package service

import (
	"errors"
	"fmt"
	"gin-epg/internal/app/dto"
	"gin-epg/internal/app/entity"
	"gin-epg/internal/app/mapper"
	"github.com/jinzhu/gorm"
	"strings"
)

/*
* 获取epgChannel集合
 */
func Diyp(ch string, date string) (programs []*dto.EpgProgramDto, standardCh *entity.EpgChannel, err error) {
	// 移除 ch 的特定后缀
	ch = removeEndMatch(ch, []string{"标清", "高清", "超清", "HD", "SD"})

	// 尝试查找标准频道名或通过别名获取标准名
	//standardCh, err = getStandardChannelName(ch)
	standardCh, err = getStandardChannel(ch)
	if err != nil {
		return nil, nil, err
	}

	// 获取原始的 EpgProgram 列表
	epgPrograms, err := mapper.GetEpgProgramByChDate(standardCh.Name, date)
	if err != nil {
		return nil, nil, err
	}

	// 将 EpgProgram 列表转换为 EpgProgramDto 列表
	for _, epgProgram := range epgPrograms {
		programDto := &dto.EpgProgramDto{
			Start: epgProgram.Start,
			End:   epgProgram.End,
			Title: epgProgram.Title,
			Desc:  epgProgram.Desc,
		}
		programs = append(programs, programDto)
	}

	return programs, standardCh, nil
}

// removeEndMatch 移除字符串末尾的指定后缀
func removeEndMatch(s string, suffixes []string) string {
	for _, suffix := range suffixes {
		if strings.HasSuffix(s, suffix) {
			s = strings.TrimSuffix(s, suffix)
		}
	}
	return s
}

// getStandardChannelName 尝试查找标准频道名或通过别名获取标准名
func getStandardChannelName(ch string) (string, error) {
	// 尝试查找标准频道名
	channel, err := mapper.GetEpgChannelByName(ch)
	if err != nil {
		return "", err
	}
	if channel != nil {
		return channel.Name, nil
	}

	// 尝试通过别名获取标准名
	alias, err := mapper.GetEpgChannelAliasByAlias(ch)
	if err != nil {
		return "", err
	}
	if alias != nil {
		return alias.Name, nil
	}

	// 频道不存在
	return "", fmt.Errorf("Channel not found")
}

func getStandardChannel(ch string) (*entity.EpgChannel, error) {
	// 尝试查找标准频道实体
	channel, err := mapper.GetEpgChannelByName(ch)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			// 处理记录未找到的情况
			println("记录未找到")
		} else {
			// 处理其他错误
			return nil, err
		}
	}
	if channel != nil {
		return channel, nil
	}

	// 尝试通过别名获取标准频道实体
	alias, err := mapper.GetEpgChannelAliasByAlias(ch)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			// 处理记录未找到的情况
			println("别名记录未找到")
		} else {
			// 处理其他错误
			return nil, err
		}
	}
	if alias != nil {
		println("通过别名获取频道")
		println(alias.Name)
		channel, err := mapper.GetEpgChannelByName(alias.Name)
		if err != nil {
			if errors.Is(err, gorm.ErrRecordNotFound) {
				// 处理记录未找到的情况
				println("通过别名获取的频道记录未找到")
			} else {
				// 处理其他错误
				return nil, err
			}
		}
		return channel, nil
	}
	// 频道不存在
	return nil, fmt.Errorf("Channel not found")
}
